package com.briup.bookstore.service.impl;

import com.briup.bookstore.common.model.entity.Category;
import com.briup.bookstore.common.exception.CustomException;
import com.briup.bookstore.common.model.param.PageParam;
import com.briup.bookstore.common.response.ResultCode;
import com.briup.bookstore.common.util.ObjectUtil;
import com.briup.bookstore.dao.CategoryDao;
import com.briup.bookstore.service.CategoryService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
public class CategoryServiceImpl implements CategoryService {

	private final CategoryDao categoryDao;

    @Override
    public List<Category> list() {
        return categoryDao.listChildren();
    }

    @Override
    public PageInfo<Category> pageQueryByClause(PageParam pageParam, Category categoryParam) {
        /* 开始分页 */
        PageHelper.startPage(pageParam.pageNum(), pageParam.pageSize());
        /* 调用Dao层查询 */
        List<Category> categories = categoryDao.selectByClause(categoryParam);
        categories.forEach(System.out::println);
        /* 封装为分页对象 */
        return PageInfo.of(categories);
    }

	/**
	 * 添加图书分类
	 *
	 * @param categoryParam 图书分类添加的基础数据实体
	 */
	@Override
	public void add(Category categoryParam) {
	    /* 参数校验 */
        if (ObjectUtil.anyNotHasText(
                categoryParam.getName())) {
            throw new CustomException(ResultCode.PARAM_NOT_COMPLETE);
        }

        /* 判断图书分类名是否已被使用 */
        if (ObjectUtil.nonNull(categoryDao.selectByName(categoryParam.getName()))) {
            throw new CustomException(ResultCode.CATEGORY_HAS_EXISTED);
        }

        /* 调用Dao层执行插入 */
        categoryDao.insert(categoryParam);
    }

    @Override
    public void update(Category categoryParam) {
        categoryDao.update(categoryParam);
    }


    @Override
    public Category getById(Integer id) {
        return categoryDao.selectById(id);
    }

    @Override
    @Transactional
    public void delete(List<Integer> ids) {
        // categoryDao.delete(ids);
        /* 参数校验：如果集合为空则直接返回 */
        if (ObjectUtil.isEmpty(ids)) {
            return;
        }

        /* 遍历集合，逐条处理删除业务 */
        for (Integer id : ids) {
            /* 判断要删除的是一级分类还是二级分类 */
            Category category = getById(id);
            /* 如果要删除的是一级分类信息，则该分类下存在子分类时不允许删除 */
            if (ObjectUtil.isNull(category.getParentId())
                    && ObjectUtil.nonEmpty(category.getChildren())) {
                throw new CustomException(ResultCode.CATEGORY_DELETE_FAILED);
            }
            /* 执行删除 */
            categoryDao.deleteById(id);
        }
    }


}
